#include "uart.h"
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <stdarg.h>

/* External variables ---------------------------------------------------------*/
extern UART_HandleTypeDef huart1;

/* Private variables ---------------------------------------------------------*/
static char buffer[1024];

/**
  * @brief 串口发送格式化字符串
  * @param format: 格式化字符串
  * @param ...: 可变参数
  * @retval None
  */
void UART_SendString(const char *format, ...)
{
    va_list args;
    int len;
    
    /* 格式化字符串 */
    va_start(args, format);
    len = vsnprintf(buffer, sizeof(buffer), format, args);
    va_end(args);
    
    /* 检查缓冲区是否溢出 */
    if(len >= sizeof(buffer))
    {
        len = sizeof(buffer) - 1;
        buffer[len] = '\0';
    }
    
    /* 使用中断模式发送 */
    HAL_UART_Transmit_IT(&huart1, (uint8_t *)buffer, len);
}

/**
  * @brief 串口初始化
  * @retval None
  */
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance == USART1)
    {
        /* 发送完成处理 */
        // 可以添加发送完成标志位设置
        // 或者准备下一次发送等操作
    }
}

void UART_Init(void)
{
    /* 启用UART全局中断 */
    HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(USART1_IRQn);
    
    /* 发送初始化信息 */
    UART_SendString("\r\nUART Init OK (Interrupt Mode)\r\n");
    UART_SendString("STM32 UART1 Test\r\n");
    UART_SendString("Test number: %d\r\n", 1234);
    UART_SendString("Test float: %.2f\r\n", 3.14159);
}
